class Solution {
    public int maxProduct(String[] words) {
        //&按位与 0&0=0;   0&1=0;    1&0=0;     1&1=1;
        //a = a | b； a|=b  运位算符，运算规则：两个数都转为二进制，然后从高位开始比较，两个数只要有一个为1则为1，否则就为0。
        //1 << a 1向左移a位 a=1*2^a
        int n = words.length;
        int idx = 0;
        int[] masks = new int[n];
        for (String word : words) {
            int num = 0;
            for (int i = 0; i < word.length(); i++) {
                int u = word.charAt(i) - 'a';
                //1<<u 使得1:001  2:010  3:0100  4:01000  
                //如：ab:011   abcd:01111  aab:011
                //|运算使得一个Word中只存在一个不同的字母
                num |= (1 << u);
            }
            masks[idx++] = num;
        }
        int ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if ((masks[i] & masks[j]) == 0) {
                    //通过&判断，一旦某一个字符的2进制相同，不等于0，跳出循环
                    //001&011-->001!=0   <==>   aaa&abb
                   ans = Math.max(ans, words[i].length() * words[j].length()); 
                }
            }
        }
        return ans;
    }
}